Appearance
2794. 从两个数组中创建对象
ts
type JSONValue = null | boolean | number | string | JSONValue[] | { [key: string]: JSONValue };
var createObject = function (keysArr, valuesArr) {
const res = {}
for (let i = 0; i < keysArr.length; i++) {
const key = String(keysArr[i]),
val = valuesArr[i]
if (!(key in res)) res[key] = val
}
return res
}去重策略
if (!(key in res)) 保证了先出现的 key 优先——如果同一个 key 出现多次,保留第一次的值。这和很多合并函数的「后者覆盖前者」策略相反,需要注意。
使用 key in res 而非 res[key] !== undefined 的好处:如果 value 本身就是 undefined,!res[key] 会误判为 key 不存在。
key 的强制转换
String(keysArr[i]) 会把任意类型的 key 转成字符串。这是因为 JavaScript 对象的键最终只能是字符串或 Symbol,即使传入数字,存储后也还是字符串。例如:
js
createObject([1, 2], ['a', 'b']); // {"1": "a", "2": "b"}注意 String(null) 和 String(undefined) 会产生 'null' 和 'undefined' 字符串,这可能不是期望行为但符合题目要求。
长度不一致
如果 keysArr 比 valuesArr 长,多出的 key 对应的 value 会是 undefined(valuesArr[i] 超出索引范围)。这些 key 仍然会被创建,只是值变成 undefined。
